home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
001-025
/
scopedisk6
/
atoolsm2
/
ademo.mod
< prev
next >
Wrap
Text File
|
1995-03-18
|
6KB
|
182 lines
MODULE AudioDemo; (* test of the AudioTool library module routines *)
(* adapted to M2Amiga Modula-2 by Anthony Bryant *)
FROM SYSTEM IMPORT
ADR,ADDRESS,BYTE,FFP;
FROM AudioTools IMPORT
InitAudio, GetChannel, StopChannel, StartChannel,
SetPV, SetWave, SetSamp, PlayNote, PlayFreq,
MayGetNote, PlaySamp, CheckIfDone, FinishAudio;
FROM Dos IMPORT
Delay;
FROM Exec IMPORT
Byte, UByte, MsgPortPtr;
FROM RandomNumber IMPORT
RND;
FROM Terminal IMPORT
WriteLn, WriteString;
TYPE
waveArray = ARRAY [0..255] OF BYTE;
CONST
noiselen = 1024;
VAR
i: CARDINAL;
channel, error, myid: LONGINT;
myport: MsgPortPtr;
sawtooth: waveArray;
triangle: waveArray;
square: waveArray;
sinewave: waveArray;
noise: ARRAY [0..noiselen-1] OF BYTE;
noiseptr: ADDRESS;
PROCEDURE MakeWaveArrays;
VAR
i: INTEGER; (* index to waveArray *)
trv,sqv: Byte;
sine,cosine,step: FFP; (* Fast Floating Point *)
BEGIN
trv:=0; sqv:=127;
sine:=0.0; cosine:=1.0; step:=0.0247;
FOR i:=0 TO 255 BY 1 DO
sawtooth[i]:= Byte(127 - i);
triangle[i]:= Byte(trv);
square[i]:= Byte(sqv);
sinewave[i]:= Byte(INTEGER(127.0 * sine));
IF (i>62) AND (i<190) THEN DEC(trv,2); ELSE INC(trv,2); END;
IF (i>127) THEN sqv:=-128; END;
cosine:= cosine - (step * sine);
sine:= sine + (step * cosine);
END;
END MakeWaveArrays;
PROCEDURE MakeNoiseArray;
VAR
i: CARDINAL;
BEGIN
FOR i:=0 TO noiselen-1 BY 1 DO
(* Use a PseudoRandom number generator to get white noise *)
noise[i]:= Byte(127 - RND(256));
END;
noiseptr:= ADR(noise[0]);
END MakeNoiseArray;
BEGIN (* AudioDemo *)
LOOP (* just once through, but with many EXITs *)
WriteLn;
WriteString("Demo of AudioTools. ");
WriteLn;
MakeWaveArrays; MakeNoiseArray;
WriteLn;
myport:= InitAudio(); (* save for MayGetNote and FinishAudio *)
IF (myport = NIL) THEN WriteString("Problem in InitAudio!"); RETURN; END;
FOR i:= 0 TO 3 BY 1 DO
channel:= GetChannel(-1);
IF (channel = -1) THEN WriteString("Cannot get a channel!"); EXIT; END;
error:= StopChannel(channel);
IF (error # 0) THEN WriteString("Error in stopping channel!"); EXIT; END;
END;
WriteString("Got & Stopped 4 channels O.K.");
WriteLn;
(* assign waveArrays using SetWave() *)
(* SetWave(channel, wavearray) *)
error:= SetWave(0, sawtooth);
IF (error # 0) THEN WriteString("Error in SetWave, ch 0"); EXIT; END;
error:= SetWave(1, triangle);
IF (error # 0) THEN WriteString("Error in SetWave, ch 1"); EXIT; END;
error:= SetWave(2, square);
IF (error # 0) THEN WriteString("Error in SetWave, ch 2"); EXIT; END;
error:= SetWave(3, sinewave);
IF (error # 0) THEN WriteString("Error in SetWave, ch 3"); EXIT; END;
WriteString("SetWave assigned all 4 waveforms.");
WriteLn;
(* PlayXXXX(channel, note/freq, vol, duration, priority,messageport, id) *)
FOR i:= 0 TO 48 BY 1 DO (* all notes, 1/8 sec. *)
PlayFreq(0, 10*i, 32, 125, 0, NIL, 0);
PlayNote(1, 95-i, 32, 125, 0, NIL, 0);
END;
WriteString("Queued up Lo-Freq PlayNotes and PlayFreqs ");
WriteLn;
(* SMACK IN THE MIDDLE HERE, INSTALL TEST OF MESSAGING *)
(* Make the note distinctive so we can tell for sure *)
PlayNote(0, 3, 63, 500, 0, myport, 7);
WriteString("Queued up Test of Messaging with id = 7");
WriteLn;
FOR i:= 50 TO 95 BY 1 DO (* all notes, 1/8 sec. *)
PlayFreq(0, 10*i, 32, 125, 0, NIL, 0);
PlayNote(1, 95-i, 32, 125, 0, NIL, 0);
END;
WriteString("Queued up Hi-Freq PlayNotes and PlayFreqs ");
WriteLn;
FOR i:= 0 TO 3 BY 1 DO
error:= StartChannel(i);
IF (error # 0) THEN WriteString("Error starting channel!"); EXIT; END;
END;
WriteString("Started all channels O.K.");
WriteLn; WriteLn;
WriteString("SLEEP now - the prioritized myid will wake me up.");
WriteLn;
myid:= MayGetNote(myport, TRUE); (* FALSE means don't sleep *)
WriteLn;
WriteString("Hey! Note I identified as ");
IF (myid = 7) THEN WriteString("7"); ELSE WriteString("0"); END;
WriteString(" just started to play");
WriteLn; WriteLn;
WriteString("Wait 6 seconds ... ");
Delay(300);
WriteString(" CheckIfDone ? - ");
IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
ELSE WriteString("TRUE"); END;
WriteLn; WriteLn;
WriteString("Now Queue up PlayNotes with duration > 2000.");
WriteLn;
PlayNote(0, 23, 32, 2000, 0, NIL, 0);
PlayNote(1, 27, 32, 2300, 0, NIL, 0);
PlayNote(2, 30, 32, 2600, 0, NIL, 0);
PlayNote(3, 35, 32, 2900, 0, NIL, 0);
WriteLn;
Delay(150); (* Waits 3 seconds after letting the last note begin
* (because last note is 2900/1000ths long).
*)
WriteString("Last note should have ended... ");
WriteString("CheckIfDone ? - ");
IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
ELSE WriteString("TRUE"); END;
WriteLn; WriteLn;
(* assign noise array to ch 0, using SetSamp() *)
(* SetSamp(channel, sampleaudio, length) *)
error:= SetSamp(0, noiseptr, noiselen);
IF (error # 0) THEN WriteString("Error in SetSamp, ch.0"); EXIT; END;
WriteString("Finally, some noise, using PlaySamp");
WriteLn;
PlaySamp(0, 327, 48, 6000, 0, NIL, 0);
(* PlaySamp(chan, samplrate, volume, 6.0sec duration, pri, msgpt, id) *)
FOR i:= 6 TO 1 BY -1 DO (* try a 6 second decay of volume *)
Delay(50);
error:= SetPV(0,327, i*8);
IF (error # 0) THEN WriteString("Error in SetPV, ch.0"); EXIT; END;
END;
(* If you take out this delay, you'll see that FinishAudio means
* FINISH AUDIO... it cuts off the notes right in the middle if necessary! *)
WriteString("Noise should have ended.");
EXIT;
END; (* LOOP *)
WriteLn; WriteLn;
WriteString("Ready to Finish Audio.");
WriteLn;
FinishAudio(myport);
WriteString("Done!");
WriteLn;
END AudioDemo.mod